package com.yuw.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import org.junit.Test;

public class TestDriver {

	/**
	 * 通过反射机制中获取一个类中的所有的属性,并对该属性进行操作处理
	 */
	@Test
	public void test03() {
		// 2、实例变量名.getClass()
		Student stu0 = new Student();

		System.out.println("反射操作之前stu0：：" + stu0);
		// 获取Class对象
		Class clazz = stu0.getClass();

		// 创建另外一个Student的实例变量
		Student stu1 = new Student();
		try {
			// 获取指定名字的属性对象
			Field fStuName = clazz.getDeclaredField("stuName");
			// 设置可以操作私有属性的权限
			fStuName.setAccessible(true);
			// 反射机制： 使用Field类中的set方法，改变边实例对象stu0的属性值
			fStuName.set(stu0, "张三");
			System.out.println("反射操作之前stu0：：" + stu0);

			System.out.println("======================");
			// 反射机制： 使用Field类中的set方法，改变边实例对象stu0的属性值
			fStuName.set(stu1, "张三222");
			System.out.println("反射操作之前stu1：：" + stu1);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 通过反射机制中获取一个类中的所有的属性列表
	 */
	@Test
	public void test02() {

		// 获取Class对象
		// 1、类名.class获取
		Class<Student> clazz = Student.class;
		// 2、获取描述属性的Field类对象
		Field[] fields = clazz.getDeclaredFields();
		// System.out.println("size:" + fields.length);
		// 3、通过Field类打印所有的属性列表
		for (Field field : fields) {
			// field变量中是每个属性的封装对象，包含了该属性的所有的信息
			System.out.println(Modifier.toString(field.getModifiers()) + " " + field.getType().getSimpleName() + " "
					+ field.getName() + ";");
		}
	}

	/**
	 * 获取反射机制中的Class对象
	 */
	@Test
	public void test01() {
		// 1、类名.class获取
		Class<Student> clazz = Student.class;

		// 2、实例变量名.getClass()
		Student stu0 = new Student();
		// 获取Class对象
		Class clazz1 = stu0.getClass();

		// 3、Class类提供一个forName的静态方法(反射方式)，Class.forName()

		try {
			// 获取Class对象
			Class clazz2 = Class.forName("com.yuw.reflection.Student");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
